2 from yap
.yap
import YapCore
, YapError
3 from yap
.util
import get_output
, takes_options
, run_safely
8 class WorkdirPlugin(YapCore
):
9 "Create extra work directories of a repository"
11 def __init__(self
, *args
, **flags
):
12 super(WorkdirPlugin
, self
).__init
__(*args
, **flags
)
14 def _unlock_branch(self
, branch
):
15 repo
= get_output('git rev-parse --git-dir')[0]
16 dir = os
.path
.join(repo
, 'yap', 'lock')
17 lockfile
= os
.path
.join(dir, branch
.replace('/', '\/'))
24 def _lock_branch(self
, branch
, locked_by
):
25 repo
= get_output('git rev-parse --git-dir')[0]
26 dir = os
.path
.join(repo
, 'yap', 'lock')
32 fd
, tmplock
= tempfile
.mkstemp("yap")
33 os
.write(fd
, locked_by
)
36 lockfile
= os
.path
.join(dir, branch
.replace('/', '\/'))
38 os
.link(tmplock
, lockfile
)
43 # If the workdir has been deleted, break his lock
44 if os
.access(user
, os
.R_OK
):
45 raise YapError("That branch is being used by an existing workdir")
49 def cmd_workdir(self
, branch
, workdir
=None):
54 branches
= get_output("git for-each-ref --format='%(refname)' 'refs/heads'")
55 if 'refs/heads/%s' % branch
not in branches
:
56 raise YapError("Not a branch: %s" % branch
)
58 current
= get_output("git symbolic-ref HEAD")[0]
60 repo
= get_output('git rev-parse --git-dir')[0]
61 repo
= os
.path
.join(os
.getcwd(), repo
)
62 repodir
= os
.path
.dirname(repo
)
64 repoparent
, reponame
= os
.path
.split(repodir
)
65 workdir
= os
.path
.join(repoparent
, "%s-%s" % (reponame
, branch
))
67 # Make sure the current branch is locked
69 self
._lock
_branch
(current
.replace('refs/heads/', ''), repodir
)
73 self
._lock
_branch
(branch
, workdir
)
78 raise YapError("Can't create new workdir: %s (%s)" % (workdir
, e
))
84 for x
in ["config", "refs", "logs/refs", "objects", "info",
85 "hooks", "packed-refs", "remotes", "svn"]:
86 if os
.path
.dirname(x
):
87 os
.makedirs(os
.path
.dirname(x
))
88 os
.symlink(os
.path
.join(repo
, x
), x
)
90 run_safely("cp %s HEAD" % os
.path
.join(repo
, 'HEAD'))
92 run_safely("git symbolic-ref HEAD refs/heads/%s" % branch
)
93 self
.cmd_revert(**{'-a': 1})
95 print "Workdir created at %s for branch %s" % (workdir
, branch
)
97 def cmd_switch(self
, branch
, *args
, **flags
):
100 current
= get_output("git symbolic-ref HEAD")[0]
102 repo
= get_output('git rev-parse --git-dir')[0]
103 self
._lock
_branch
(branch
, repo
)
106 super(WorkdirPlugin
, self
).cmd_switch(branch
, *args
, **flags
)
108 self
._unlock
_branch
(branch
)
111 self
._unlock
_branch
(current
.replace('refs/heads/', ''))