def get_git_dir(): abspath = os.path.abspath('.') git_dir = os.path.join(abspath, '.git') if os.path.isdir(git_dir): return abspath else: return execute(['git', 'rev-parse', '--show-toplevel'])
def get_git_dir(): abspath = os.path.abspath('.') git_dir = os.path.join(abspath, '.git') if os.path.exists(git_dir) and os.path.isdir(git_dir): return abspath else: return execute('git rev-parse --show-toplevel')
def get_git_dir(): toplevel_dir = execute(['git', 'rev-parse', '--show-toplevel']) if toplevel_dir is not None \ and os.path.isfile(os.path.join(toplevel_dir, '.git')): # Not a normal git repo. Check if it's a submodule, then use # toplevel_dir. Otherwise it's a worktree, thus use common_dir. # NOTE: git worktree support only comes with git v2.5.0 or # later, on earler versions toplevel_dir is the best we can do. cmd = ['git', 'rev-parse', '--is-inside-work-tree'] inside_worktree = execute(cmd, cwd=os.path.join(toplevel_dir, '..')) if inside_worktree == 'true' or Git().version_info[:3] < (2, 5, 0): return toplevel_dir else: return execute(['git', 'rev-parse', '--git-common-dir']) return toplevel_dir
def __init__(self, testing=False, sparse=False): # Sparse init: config only if sparse: self.git = GitWrapper(None) # Load configuration self.settings = self.default_settings.copy() self.load_config() return # Testing: redirect stderr to stdout self.testing = testing if self.testing: self.stderr = sys.stdout # Quiet testing else: # pragma: no cover self.stderr = sys.stderr self.states = [] # Check, if we're in a git repo try: self.repo = Repo(execute('git rev-parse --show-toplevel'), odbt=GitCmdObjectDB) except IndexError: exc = GitError("We don't seem to be in a git repository.") self.print_error(exc) raise exc # Check for branch tracking informatino if not any(b.tracking_branch() for b in self.repo.branches): exc = GitError("Can\'t update your repo because it doesn\'t has " "any branches with tracking information.") self.print_error(exc) raise exc self.git = GitWrapper(self.repo) # target_map: map local branch names to remote tracking branches self.target_map = dict() for branch in self.repo.branches: target = branch.tracking_branch() if target: if target.name.startswith('./'): # Tracking branch is in local repo target.is_local = True else: target.is_local = False self.target_map[branch.name] = target # branches: all local branches with tracking information self.branches = [b for b in self.repo.branches if b.tracking_branch()] self.branches.sort(key=lambda br: br.name) # remotes: all remotes that are associated with local branches self.remotes = uniq( # name = '<remote>/<branch>' -> '<remote>' [r.name.split('/', 2)[0] for r in list(self.target_map.values())] ) # change_count: Number of unstaged changes self.change_count = len( self.git.status(porcelain=True, untracked_files='no').split('\n') ) # Load configuration self.settings = self.default_settings.copy() self.load_config()
def __init__(self, testing=False, sparse=False): # Sparse init: config only if sparse: self.git = GitWrapper(None) # Load configuration self.settings = self.default_settings.copy() self.load_config() return # Testing: redirect stderr to stdout self.testing = testing if testing: self.stderr = sys.stdout # Quiet testing else: self.stderr = sys.stderr self.states = [] # Check, if we're in a git repo try: self.repo = Repo(execute('git rev-parse --show-toplevel'), odbt=GitCmdObjectDB) except IndexError: exc = GitError("We don't seem to be in a git repository.") self.print_error(exc) raise exc # Check for branch tracking informatino if not any(b.tracking_branch() for b in self.repo.branches): exc = GitError("Can\'t update your repo because it doesn\'t has " "any branches with tracking information.") self.print_error(exc) raise exc self.git = GitWrapper(self.repo) # target_map: map local branch names to remote tracking branches self.target_map = dict() for branch in self.repo.branches: target = branch.tracking_branch() if target: if target.name.startswith('./'): # Tracking branch is in local repo target.is_local = True else: target.is_local = False self.target_map[branch.name] = target # branches: all local branches with tracking information self.branches = [b for b in self.repo.branches if b.tracking_branch()] self.branches.sort(key=lambda br: br.name) # remotes: all remotes that are associated with local branches self.remotes = uniq( # name = '<remote>/<branch>' -> '<remote>' [r.name.split('/', 2)[0] for r in list(self.target_map.values())] ) # change_count: Number of unstaged changes self.change_count = len( self.git.status(porcelain=True, untracked_files='no').split('\n') ) # Load configuration self.settings = self.default_settings.copy() self.load_config()