Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 43 additions & 3 deletions build.py
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,33 @@ def clone_or_update_repo(name, branch, dir_name, owner="openwisp", dest=None):
If the repository already exists, update it. Otherwise, clone the repository.
"""
repository = f"{owner}/{name}"
# Support for building with local changes
if name == "openwisp-docs" and not os.environ.get("PRODUCTION"):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why when PRODUCTION is set the behavior is different?

Copy link
Author

@atif09 atif09 Jan 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i added the PRODUCTION check thinking CI might need to clone from github but i just lookedat the CI workflow and it already checks out the specific branch before building so using local files would work fine in CI too

ill remove this check

print(f"Using local directory for '{name}'")

if os.path.islink("staging-dir") or os.path.isfile("staging-dir"):
os.unlink("staging-dir")
os.makedirs("staging-dir", exist_ok=True)
exclude_items = {"staging-dir", "modules", "_build", ".git", "__pycache__"}
for item in os.listdir("."):
if item.startswith("."):
continue

if item in exclude_items:
continue

# skip virtual environments (detect with pyvenv.cfg)
if os.path.isdir(item) and os.path.exists(os.path.join(item, "pyvenv.cfg")):
continue

src_path = os.path.abspath(item)
dest_path = os.path.join("staging-dir", item)
if os.path.islink(dest_path):
os.unlink(dest_path)
if not os.path.exists(dest_path):
os.symlink(src_path, dest_path)
return

if os.environ.get("SSH"):
# SSH cloning is a convenient option for local development, as it
# allows you to commit changes directly to the repository, but it
Expand All @@ -286,15 +313,28 @@ def clone_or_update_repo(name, branch, dir_name, owner="openwisp", dest=None):
if os.path.exists(clone_path):
print(f"Repository '{name}' already exists. Updating...")
subprocess.run(
# Clears ambiguity when git tags and branches have identical names
["git", "fetch", "origin", f"refs/heads/{branch}:refs/heads/{branch}"],
# Update remote-tracking ref (avoid fetching into checked-out branch)
[
"git",
"fetch",
"origin",
f"+refs/heads/{branch}:refs/remotes/origin/{branch}",
],
cwd=clone_path,
check=True,
)
# "-c advice.detachedHead=false" is used to suppress the warning
# about being in a detached HEAD state when checking out tags.
subprocess.run(
["git", "-c", "advice.detachedHead=false", "checkout", f"refs/heads/{branch}"],
Copy link
Author

@atif09 atif09 Jan 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ill double check this too

[
"git",
"-c",
"advice.detachedHead=false",
"checkout",
"-B",
branch,
f"refs/remotes/origin/{branch}",
],
cwd=clone_path,
check=True,
)
Expand Down