summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-12-09 20:27:22 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-12-09 20:27:22 -0400
commitfb8231f3a1eb67e61a7df0381dc82be2f0ca0417 (patch)
treea082bdf63554745c1fd31c9a4b5db9cbb99f483e
parent4b3c4c0c2b88aa17a9b7822470e3e5dd2a3e7c2b (diff)
sync: New command that synchronises the local repository and default remote, by running git commit, pull, and push for you.
-rw-r--r--Command/Sync.hs64
-rw-r--r--GitAnnex.hs4
-rw-r--r--debian/changelog2
-rw-r--r--doc/git-annex.mdwn11
4 files changed, 80 insertions, 1 deletions
diff --git a/Command/Sync.hs b/Command/Sync.hs
new file mode 100644
index 000000000..c0d7f37ad
--- /dev/null
+++ b/Command/Sync.hs
@@ -0,0 +1,64 @@
+{- git-annex command
+ -
+ - Copyright 2011 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Command.Sync where
+
+import Common.Annex
+import Command
+import qualified Annex.Branch
+import qualified Git
+
+import qualified Data.ByteString.Lazy.Char8 as L
+
+def :: [Command]
+def = [command "sync" paramPaths seek "synchronize local repository with remote"]
+
+seek :: [CommandSeek]
+seek = [withNothing start]
+
+start :: CommandStart
+start = do
+ showStart "sync" "."
+ showOutput
+ next perform
+
+perform :: CommandPerform
+perform = do
+ remote <- defaultRemote =<< currentBranch
+ checkRemote remote
+ commit
+ inRepo $ Git.run "pull" [Param remote]
+ Annex.Branch.update
+ inRepo $ Git.run "push" [Param remote, matchingbranches]
+ next $ return True
+ where
+ -- git push may be configured to not push matching
+ -- branches; this should ensure it always does.
+ matchingbranches = Param ":"
+
+commit :: Annex ()
+commit = do
+ -- Commit will fail when the tree is clean (or when in a confliced
+ -- merge, etc). Ignore failure.
+ _ <- inRepo $ Git.runBool "commit" [Param "-a", Param "-m", Param "sync"]
+ return ()
+
+-- the remote defaults to origin when not configured
+defaultRemote :: String -> Annex String
+defaultRemote branch =
+ fromRepo $ Git.configGet ("branch." ++ branch ++ ".remote") "origin"
+
+currentBranch :: Annex String
+currentBranch = last . split "/" . L.unpack . head . L.lines <$>
+ inRepo (Git.pipeRead [Param "symbolic-ref", Param "HEAD"])
+
+checkRemote :: String -> Annex ()
+checkRemote remote = do
+ remoteurl <- fromRepo $
+ Git.configGet ("remote." ++ remote ++ ".url") ""
+ when (null remoteurl) $ do
+ error $ "No url is configured for the remote: " ++ remote
diff --git a/GitAnnex.hs b/GitAnnex.hs
index d768499dd..7871638e4 100644
--- a/GitAnnex.hs
+++ b/GitAnnex.hs
@@ -47,6 +47,7 @@ import qualified Command.Trust
import qualified Command.Untrust
import qualified Command.Semitrust
import qualified Command.Dead
+import qualified Command.Sync
import qualified Command.AddUrl
import qualified Command.Map
import qualified Command.Upgrade
@@ -61,6 +62,8 @@ cmds = concat
, Command.Copy.def
, Command.Unlock.def
, Command.Lock.def
+ , Command.Sync.def
+ , Command.AddUrl.def
, Command.Init.def
, Command.Describe.def
, Command.InitRemote.def
@@ -72,7 +75,6 @@ cmds = concat
, Command.Untrust.def
, Command.Semitrust.def
, Command.Dead.def
- , Command.AddUrl.def
, Command.FromKey.def
, Command.DropKey.def
, Command.Fix.def
diff --git a/debian/changelog b/debian/changelog
index 1c27ad566..b481d9999 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -9,6 +9,8 @@ git-annex (3.20111204) UNRELEASED; urgency=low
multiple different encrypted special remotes.
* unannex: Can be run on files that have been added to the annex, but not
yet committed.
+ * sync: New command that synchronises the local repository and default
+ remote, by running git commit, pull, and push for you.
-- Joey Hess <joeyh@debian.org> Sun, 04 Dec 2011 12:22:37 -0400
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
index 08def0d62..d7a51663f 100644
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -120,6 +120,17 @@ subdirectories).
Use this to undo an unlock command if you don't want to modify
the files, or have made modifications you want to discard.
+* sync
+
+ Use this command when you want to synchronize the local repository
+ with its default remote (typically "origin"). The sync process involves
+ first committing all local changes, then pulling and merging any changes
+ from the remote, and finally pushing the repository's state to the remote.
+ You can use standard git commands to do each of those steps by hand,
+ or if you don't want to worry about the details, you can use sync.
+
+ Note that sync does not transfer any file contents from or to the remote.
+
* addurl [url ...]
Downloads each url to a file, which is added to the annex.