# Announcement: automatic merging for the General registry

**URL:** <https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961>\
**Category:** Community\
**Tags:** package, announcement, pkg, announcements, package-manager\
**Created:** [October 15, 2019, 11:27pm UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961 "2019-10-15T23:27:06Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![dilumaluthge](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dilumaluthge/32/29283_2.png) [@dilumaluthge](https://discourse.julialang.org/u/dilumaluthge)\
**Post date:** [October 15, 2019, 11:27pm UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/1 "2019-10-15T23:27:06Z")

</div>

I’m pleased to announce that we are rolling out the first iteration of automatic merging for the [General registry](https://github.com/JuliaRegistries/General).

In order for your pull request to be automerged, it needs to meet the automerge [guidelines](https://github.com/JuliaRegistries/General/issues/3673):

### New packages

1. Normal capitalization

2. Not too short

3. Standard initial version number

4. Repo URL ends with `/$name.jl.git` where `name` is the package name

5. Compat for all dependencies

6. Package can be installed

7. Package can be loaded

### New versions of existing packages

1. Sequential version number

2. Compat for all dependencies

3. Version can be installed

4. Version can be loaded

### Important note

> These guidelines are intended not as requirements for packages but as very conservative guidelines, which, if your new package or new version of a package meets them, it may be automatically merged.

---

<div class="post-metadata">

**Author:** ![dilumaluthge](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dilumaluthge/32/29283_2.png) [@dilumaluthge](https://discourse.julialang.org/u/dilumaluthge)\
**Post date:** [October 15, 2019, 11:28pm UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/2 "2019-10-15T23:28:25Z")

</div>

Also, please note that commenting on a pull request will automatically disable automerging on that pull request. Therefore, if you want to leave a comment on a pull request but you still want that pull request to be automerged, please include the text `[noblock]` in your comment.

---

<div class="post-metadata">

**Author:** ![anon92994695](https://avatars.discourse-cdn.com/v4/letter/a/ce7236/32.png) [@anon92994695](https://discourse.julialang.org/u/anon92994695)\
**Post date:** [October 16, 2019, 1:07am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/3 "2019-10-16T01:07:08Z")

</div>

Can you either give an example of how to write the compat statements or point to it somewhere in the docs? I’m very interested in having this autonomy!

---

<div class="post-metadata">

**Author:** ![dilumaluthge](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dilumaluthge/32/29283_2.png) [@dilumaluthge](https://discourse.julialang.org/u/dilumaluthge)\
**Post date:** [October 16, 2019, 1:09am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/4 "2019-10-16T01:09:04Z")

</div>

> [@anon92994695](#):
>
> Can you either give an example of how to write the compat statements or point to it somewhere in the docs?

[https://julialang.github.io/Pkg.jl/v1/compatibility/](https://julialang.github.io/Pkg.jl/v1/compatibility/)

---

<div class="post-metadata">

**Author:** ![anon92994695](https://avatars.discourse-cdn.com/v4/letter/a/ce7236/32.png) [@anon92994695](https://discourse.julialang.org/u/anon92994695)\
**Post date:** [October 16, 2019, 1:11am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/5 "2019-10-16T01:11:17Z")

</div>

Cool thank you!

---

<div class="post-metadata">

**Author:** ![tlienart](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tlienart/32/7640_2.png) [@tlienart](https://discourse.julialang.org/u/tlienart)\
**Post date:** [October 16, 2019, 8:53am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/6 "2019-10-16T08:53:42Z")

</div>

Great, for registrations currently in the backlog, should we bump them to trigger zeptodoctor or is it best to just wait for a kind human registrator to merge them?

Ps: compat bounds for all deps 😱

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [October 16, 2019, 9:01am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/7 "2019-10-16T09:01:18Z")

</div>

Is there still a 3-day waiting period for new packages?

For version updates, is the new version merged once the checks complete, or is it a process that is run periodically?

---

<div class="post-metadata">

**Author:** ![tlienart](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tlienart/32/7640_2.png) [@tlienart](https://discourse.julialang.org/u/tlienart)\
**Post date:** [October 16, 2019, 9:03am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/8 "2019-10-16T09:03:00Z")

</div>

I think it’s “yes” for both questions and maybe this is useful: [https://github.com/JuliaRegistries/General/blob/35a193ca487155b7c4b9ececba086f579e13df61/.travis.yml#L18](https://github.com/JuliaRegistries/General/blob/35a193ca487155b7c4b9ececba086f579e13df61/.travis.yml#L18)

---

<div class="post-metadata">

**Author:** ![fredrikekre](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fredrikekre/32/1688_2.png) [@fredrikekre](https://discourse.julialang.org/u/fredrikekre)\
**Post date:** [October 16, 2019, 10:50am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/9 "2019-10-16T10:50:45Z")

</div>

> [@tlienart](#):
>
> Great, for registrations currently in the backlog, should we bump them to trigger zeptodoctor or is it best to just wait for a kind human registrator to merge them?

You can retrigger if you want but I will go through the backlog manually later.

> [@Tamas\_Papp](#):
>
> Is there still a 3-day waiting period for new packages?

Yes.

> [@Tamas\_Papp](#):
>
> For version updates, is the new version merged once the checks complete, or is it a process that is run periodically?

The regular CI run approves the PR and then a cronjob merges. I set it to run every hour for now since the influx of PRs that meet the requirements is at the moment very low.

---

<div class="post-metadata">

**Author:** ![feanor12](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/feanor12/32/8212_2.png) [@feanor12](https://discourse.julialang.org/u/feanor12)\
**Post date:** [October 16, 2019, 4:08pm UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/10 "2019-10-16T16:08:59Z")

</div>

Is it possible to add very similar sounding malicious packages that way?

---

<div class="post-metadata">

**Author:** ![StefanKarpinski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stefankarpinski/32/24_2.png) [@StefanKarpinski](https://discourse.julialang.org/u/StefanKarpinski)\
**Post date:** [October 16, 2019, 4:21pm UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/11 "2019-10-16T16:21:34Z")

</div>

We’ll be implementing this: [https://github.com/JuliaLang/Pkg.jl/issues/931](https://github.com/JuliaLang/Pkg.jl/issues/931). That’s also part of why there’s a three day waiting period. But adding a check that the edit distance to other package names is not too small is a good idea. Issue opened:

[https://github.com/JuliaRegistries/GeneralRegistryCI.jl/issues/10](https://github.com/JuliaRegistries/GeneralRegistryCI.jl/issues/10)

---

<div class="post-metadata">

**Author:** ![tkf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tkf/32/17635_2.png) [@tkf](https://discourse.julialang.org/u/tkf)\
**Post date:** [October 17, 2019, 1:11am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/12 "2019-10-17T01:11:21Z")

</div>

> [@dilumaluthge](#):
>
> - all `[deps]` should also have `[compat]` entries (and Julia itself)
> - all `[compat]` entries should have upper bounds

What about stdlibs? They typically do not have `version` entry (except Pkg.jl?):

> <https://github.com/JuliaLang/julia/blob/v1.2.0/stdlib/Test/Project.toml>

Should their versions be identical to `[compat]` for `julia`?

---

<div class="post-metadata">

**Author:** ![dilumaluthge](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dilumaluthge/32/29283_2.png) [@dilumaluthge](https://discourse.julialang.org/u/dilumaluthge)\
**Post date:** [October 17, 2019, 1:20am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/13 "2019-10-17T01:20:20Z")

</div>

`stdlib` dependencies do not need compat entries.

---

<div class="post-metadata">

**Author:** ![tkf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tkf/32/17635_2.png) [@tkf](https://discourse.julialang.org/u/tkf)\
**Post date:** [October 17, 2019, 1:34am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/14 "2019-10-17T01:34:12Z")

</div>

Thanks for the clarification.

But wouldn’t it be a problem if:

- packages upper-bound `julia` version as `< 2`,
- stdlibs are decoupled from `julia` distribution, and
- the packages start lower-bounding stdlib?

In this scenario, IIUC, older packages without stdlib bounds can be chosen by the dependency resolver. Not that this is the worst problem, since there are so many packages without upper bounds. But my impression was that start requiring upper bounds was for avoiding this kind of situation and making Julia ecosystem more robust.

---

<div class="post-metadata">

**Author:** ![dilumaluthge](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dilumaluthge/32/29283_2.png) [@dilumaluthge](https://discourse.julialang.org/u/dilumaluthge)\
**Post date:** [October 17, 2019, 1:36am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/15 "2019-10-17T01:36:19Z")

</div>

You can retroactively add compat bounds to old versions of your packages. Just make a pull request directly to the General registry.

---

<div class="post-metadata">

**Author:** ![dilumaluthge](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dilumaluthge/32/29283_2.png) [@dilumaluthge](https://discourse.julialang.org/u/dilumaluthge)\
**Post date:** [October 17, 2019, 1:37am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/16 "2019-10-17T01:37:29Z")

</div>

Perhaps we should open an issue to discuss whether we should require compat entries for stdlibs. Can you open an issue here: [https://github.com/JuliaRegistries/RegistryCI.jl/issues](https://github.com/JuliaRegistries/RegistryCI.jl/issues)

---

<div class="post-metadata">

**Author:** ![tkf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tkf/32/17635_2.png) [@tkf](https://discourse.julialang.org/u/tkf)\
**Post date:** [October 17, 2019, 1:42am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/17 "2019-10-17T01:42:06Z")

</div>

Sure:

[https://github.com/JuliaRegistries/RegistryCI.jl/issues/19](https://github.com/JuliaRegistries/RegistryCI.jl/issues/19)

---

<div class="post-metadata">

**Author:** ![tkf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tkf/32/17635_2.png) [@tkf](https://discourse.julialang.org/u/tkf)\
**Post date:** [October 17, 2019, 1:51am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/18 "2019-10-17T01:51:26Z")

</div>

> [@dilumaluthge](#):
>
> You can retroactively add compat bounds to old versions of your packages. Just make a pull request directly to the General registry.

BTW, it took me for a while to realize that this is the case. I think it might be very surprising for people coming from other language ecosystems. It would be nice to document it somewhere. Maybe Pkg.jl documentation? But it’s not strictly about Pkg.jl and presumably, each registry can have a different policy for this.

I’m also a bit worried about this flexibility. It would mean that `Manifest.toml` generated at some point in time can become “invalid” in the sense it becomes impossible for Pkg.jl to generate the same `Manifest.toml` (even when there is no new versions are released). Can we get around this by enforcing some kind of monotonicity in the compat bounds change in JuliaRegistries/General (e.g., only increasing bounds is allowed)? Another worry is that this probably is not going scale once JuliaRegistries/General becomes (say) as big as PyPI.

---

<div class="post-metadata">

**Author:** ![StefanKarpinski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stefankarpinski/32/24_2.png) [@StefanKarpinski](https://discourse.julialang.org/u/StefanKarpinski)\
**Post date:** [October 17, 2019, 2:11am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/19 "2019-10-17T02:11:23Z")

</div>

Why is that a problem?

---

<div class="post-metadata">

**Author:** ![tkf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tkf/32/17635_2.png) [@tkf](https://discourse.julialang.org/u/tkf)\
**Post date:** [October 17, 2019, 2:31am UTC](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961/20 "2019-10-17T02:31:54Z")

</div>

@StefanKarpinski I noted a few potential issues in last comments, but assuming that you are referring to:

> [@tkf](#):
>
> It would mean that `Manifest.toml` generated at some point in time can become “invalid” in the sense it becomes impossible for Pkg.jl to generate the same `Manifest.toml`

I think this would also mean that, a `Project.toml` with some “tight” `[compat]` that is `Pkg.instantiate`able at some points in time may not be so at other points in time. I find it contradictory to the emphasis on immutable aspects in the rest of Pkg.jl. Also, I suppose it means that `Pkg.resolve` is not an idempotent operation? I think is a reasonable assumption one can make, even though it’s not documented to be so.

Maybe it’s OK since full reproducibility still requires `Manifest.toml` anyway. But, if JuliaRegistries/General “officially” allows tweaking version bounds, I think it’s nice to document these properties.

[Next page](https://discourse.julialang.org/t/announcement-automatic-merging-for-the-general-registry/29961.md?page=2)
