Skip to content

Commit

Permalink
Refactor out all git IO utility functions into another module.
Browse files Browse the repository at this point in the history
  • Loading branch information
jakirkham committed Oct 29, 2016
1 parent e780612 commit b4f28ff
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 71 deletions.
79 changes: 8 additions & 71 deletions conda_smithy/configure_feedstock.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@
from conda_build_all.resolved_distribution import ResolvedDistribution
from jinja2 import Environment, FileSystemLoader

from conda_smithy.feedstock_io import (
get_mode_file,
set_mode_file,
write_file,
remove_file,
copy_file,
)

conda_forge_content = os.path.abspath(os.path.dirname(__file__))


Expand All @@ -32,77 +40,6 @@ def meta_config(meta):
return config


def get_repo(path, search_parent_directories=True):
repo = None
try:
import git
repo = git.Repo(
path,
search_parent_directories=search_parent_directories
)
except ImportError:
pass
except git.InvalidGitRepositoryError:
pass

return repo


def get_file_blob(repo, filename):
idx = repo.index
rel_filepath = os.path.relpath(filename, repo.working_dir)
blob = idx.iter_blobs(lambda _: _[1].path == rel_filepath).next()[1]
return blob


def get_mode_file(filename):
repo = get_repo(filename)
if repo:
blob = get_file_blob(repo, filename)
mode = blob.mode
else:
mode = os.stat(filename).st_mode

return mode


def set_mode_file(filename, mode):
repo = get_repo(filename)
if repo:
blob = get_file_blob(repo, filename)
blob.mode |= mode
repo.index.add([blob])

os.chmod(filename, mode)


@contextmanager
def write_file(filename):
with open(filename, "w") as fh:
yield fh

repo = get_repo(filename)
if repo:
repo.index.add([filename])


def remove_file(filename):
if os.path.exists(filename):
repo = get_repo(filename)
if repo:
repo.index.remove([filename])

os.remove(filename)


def copy_file(src, dst):
shutil.copy2(src, dst)

repo = get_repo(dst)
if repo:
repo.index.add([dst])


def render_run_docker_build(jinja_env, forge_config, forge_dir):
meta = forge_config['package']
with fudge_subdir('linux-64', build_config=meta_config(meta)):
Expand Down
74 changes: 74 additions & 0 deletions conda_smithy/feedstock_io.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
from contextlib import contextmanager
import os
import shutil


def get_repo(path, search_parent_directories=True):
repo = None
try:
import git
repo = git.Repo(
path,
search_parent_directories=search_parent_directories
)
except ImportError:
pass
except git.InvalidGitRepositoryError:
pass

return repo


def get_file_blob(repo, filename):
idx = repo.index
rel_filepath = os.path.relpath(filename, repo.working_dir)
blob = idx.iter_blobs(lambda _: _[1].path == rel_filepath).next()[1]
return blob


def get_mode_file(filename):
repo = get_repo(filename)
if repo:
blob = get_file_blob(repo, filename)
mode = blob.mode
else:
mode = os.stat(filename).st_mode

return mode


def set_mode_file(filename, mode):
repo = get_repo(filename)
if repo:
blob = get_file_blob(repo, filename)
blob.mode |= mode
repo.index.add([blob])

os.chmod(filename, mode)


@contextmanager
def write_file(filename):
with open(filename, "w") as fh:
yield fh

repo = get_repo(filename)
if repo:
repo.index.add([filename])


def remove_file(filename):
if os.path.exists(filename):
repo = get_repo(filename)
if repo:
repo.index.remove([filename])

os.remove(filename)


def copy_file(src, dst):
shutil.copy2(src, dst)

repo = get_repo(dst)

This comment has been minimized.

Copy link
@shadowwalkersb

shadowwalkersb Feb 19, 2017

Contributor

When running conda smithy init, has git repo initialized at this point?

This comment has been minimized.

Copy link
@jakirkham

jakirkham Feb 19, 2017

Author Member

AFAICT currently the answer is no. It would definitely be interesting to have this actually work on an existing repo. However, as noted below, creating repos inside of other repos that are not submodules is a recipe for disaster.

This comment has been minimized.

Copy link
@jakirkham

jakirkham Feb 19, 2017

Author Member

Put together PR ( #460 ), which will change this. If a git repo is to be created, it will be created initially and all changes will be added to it directly.

if repo:

This comment has been minimized.

Copy link
@shadowwalkersb

shadowwalkersb Feb 19, 2017

Contributor

Even if the feedstock repo has not been initialized yet, if there is another repo in upper levels, get_repo(dst) will, probably, return that repo. May be safer to check for `.git' here.

This comment has been minimized.

Copy link
@jakirkham

jakirkham Feb 19, 2017

Author Member

TBH I would argue that running conda smithy init on a directory inside of another existing repo is undefined behavior. Would even add that this is unsupported too. Why do you need to do this?

This comment has been minimized.

Copy link
@shadowwalkersb

shadowwalkersb Feb 19, 2017

Contributor

Well, it just turns out that I have various repositories at various levels. Some are project repos, some are settings files like user profile settings or IDE settings that I have kept under version control.

repo.index.add([dst])

0 comments on commit b4f28ff

Please sign in to comment.