Use FETCH_HEAD to know where to rebase to after pull.
[stgit] / stgit / commands / pull.py
index 4a82fe8..b63ef7a 100644 (file)
@@ -24,71 +24,65 @@ from stgit import stack, git
 
 
 help = 'pull the changes from the remote repository'
 
 
 help = 'pull the changes from the remote repository'
-usage = """%prog [options]
+usage = """%prog [options] [<repository>]
 
 
-Pull the latest changes from the parent repository. This command works
+Pull the latest changes from the given remote repository (defaulting
+to branch.<name>.remote, or 'origin' if not set). This command works
 by popping all the patches from the stack, pulling the changes in the
 parent repository, setting the base of the stack to the latest parent
 by popping all the patches from the stack, pulling the changes in the
 parent repository, setting the base of the stack to the latest parent
-HEAD and pusing the patches back (unless '--nopush' is specified). The
-'push' operation can fail if there are conflicts. They need to be
-resolved and the patch pushed again. The URL of the parent repository
-is specified in the .git/branches/<head> file.
+HEAD and pushing the patches back (unless '--nopush' is specified).
+The 'push' operation can fail if there are conflicts. They need to be
+resolved and the patch pushed again.
 
 
-Note that this command doesn't perform any merge operation for the
-base of the stack, it only performs merges with the patches being
-pushed."""
+Check the 'git fetch' documentation for the <repository> format."""
 
 options = [make_option('-n', '--nopush',
                        help = 'do not push the patches back after pulling',
                        action = 'store_true'),
 
 options = [make_option('-n', '--nopush',
                        help = 'do not push the patches back after pulling',
                        action = 'store_true'),
-           make_option('--head', metavar='OTHER_HEAD',
-                       help = 'pull OTHER_HEAD instead of HEAD'),
-           make_option('--tag',
-                       help = 'pull TAG')]
-
+           make_option('-m', '--merged',
+                       help = 'check for patches merged upstream',
+                       action = 'store_true')]
 
 def func(parser, options, args):
     """Pull the changes from a remote repository
     """
 
 def func(parser, options, args):
     """Pull the changes from a remote repository
     """
-    if len(args) != 0:
+    if len(args) > 1:
         parser.error('incorrect number of arguments')
 
         parser.error('incorrect number of arguments')
 
+    if len(args) >= 1:
+        repository = args[0]
+    else:
+        repository = crt_series.get_parent_remote()
+
+    if crt_series.get_protected():
+        raise CmdException, 'This branch is protected. Pulls are not permitted'
+
     check_local_changes()
     check_conflicts()
     check_head_top_equal()
 
     check_local_changes()
     check_conflicts()
     check_head_top_equal()
 
-    branch = git.get_head_file()
-    location = read_string(os.path.join(git.base_dir, 'branches', branch))
-    orig_head = git_id('base')
-
-    print 'Pulling from "%s"...' % location
-    new_head = git.fetch(location, options.head, options.tag)
+    # pop all patches
+    applied = crt_series.get_applied()
+    if len(applied) > 0:
+        print 'Popping all applied patches...',
+        sys.stdout.flush()
+        crt_series.pop_patch(applied[0])
+        print 'done'
+
+    # pull the remote changes
+    print 'Pulling from "%s"...' % repository
+    git.fetch(repository)
+    if (config.get('stgit.pull-does-rebase') == 'yes'):
+        print 'rebasing to "%s"...' % git.fetch_head()
+        git.reset(tree_id = git.fetch_head())
     print 'done'
 
     print 'done'
 
-    if new_head == orig_head:
-        print 'Branch already up-to-date'
-    else:
-        write_string(os.path.join(git.base_dir, 'ORIG_HEAD'), orig_head)
-
-        applied = crt_series.get_applied()
-
-        if len(applied) > 0:
-            print 'Popping all patches...',
-            sys.stdout.flush()
-            crt_series.pop_patch(applied[0])
-            print 'done'
-
-        git.switch(new_head)
-
-        if options.nopush:
-            applied = []
-        for p in applied:
-            print 'Pushing patch "%s"...' % p,
-            sys.stdout.flush()
-            crt_series.push_patch(p)
-            if crt_series.empty_patch(p):
-                print 'done (empty patch)'
-            else:
-                print 'done'
+    # push the patches back
+    if not options.nopush:
+        push_patches(applied, options.merged)
+
+    # maybe tidy up
+    if config.get('stgit.keepoptimized') == 'yes':
+        git.repack()
 
     print_crt_patch()
 
     print_crt_patch()