{"diffoscope-json-version": 1, "source1": "/srv/reproducible-results/rbuild-debian/r-b-build.Wh36Y7ir/b1/jupyterhub_5.2.1+ds1-4_amd64.changes", "source2": "/srv/reproducible-results/rbuild-debian/r-b-build.Wh36Y7ir/b2/jupyterhub_5.2.1+ds1-4_amd64.changes", "unified_diff": null, "details": [{"source1": "Files", "source2": "Files", "unified_diff": "@@ -1,2 +1,2 @@\n \n- c73465d5b679fcc42d39cbdf1b4abe9e 2022704 python optional jupyterhub_5.2.1+ds1-4_all.deb\n+ f81ff22c7a13b798d0f18eb1b3cc9dfb 2022656 python optional jupyterhub_5.2.1+ds1-4_all.deb\n"}, {"source1": "jupyterhub_5.2.1+ds1-4_all.deb", "source2": "jupyterhub_5.2.1+ds1-4_all.deb", "unified_diff": null, "details": [{"source1": "file list", "source2": "file list", "unified_diff": "@@ -1,3 +1,3 @@\n -rw-r--r-- 0 0 0 4 2025-05-28 09:40:25.000000 debian-binary\n--rw-r--r-- 0 0 0 59480 2025-05-28 09:40:25.000000 control.tar.xz\n--rw-r--r-- 0 0 0 1963032 2025-05-28 09:40:25.000000 data.tar.xz\n+-rw-r--r-- 0 0 0 59496 2025-05-28 09:40:25.000000 control.tar.xz\n+-rw-r--r-- 0 0 0 1962968 2025-05-28 09:40:25.000000 data.tar.xz\n"}, {"source1": "control.tar.xz", "source2": "control.tar.xz", "unified_diff": null, "details": [{"source1": "control.tar", "source2": "control.tar", "unified_diff": null, "details": [{"source1": "./md5sums", "source2": "./md5sums", "unified_diff": null, "details": [{"source1": "./md5sums", "source2": "./md5sums", "comments": ["Files differ"], "unified_diff": null}]}]}]}, {"source1": "data.tar.xz", "source2": "data.tar.xz", "unified_diff": null, "details": [{"source1": "data.tar", "source2": "data.tar", "unified_diff": null, "details": [{"source1": "./usr/share/jupyterhub/jupyterhub_config.py", "source2": "./usr/share/jupyterhub/jupyterhub_config.py", "unified_diff": "@@ -997,120 +997,14 @@\n # \n # It should return the new URL to redirect to, or None to preserve current\n # behavior.\n # Default: None\n # c.JupyterHub.user_redirect_hook = None\n \n #------------------------------------------------------------------------------\n-# Proxy(LoggingConfigurable) configuration\n-#------------------------------------------------------------------------------\n-## Base class for configurable proxies that JupyterHub can use.\n-# \n-# A proxy implementation should subclass this and must define the following\n-# methods:\n-# \n-# - :meth:`.get_all_routes` return a dictionary of all JupyterHub-related routes\n-# - :meth:`.add_route` adds a route - :meth:`.delete_route` deletes a route\n-# \n-# In addition to these, the following method(s) may need to be implemented:\n-# \n-# - :meth:`.start` start the proxy, if it should be launched by the Hub\n-# instead of externally managed.\n-# If the proxy is externally managed, it should set :attr:`should_start` to False.\n-# - :meth:`.stop` stop the proxy. Only used if :meth:`.start` is also used.\n-# \n-# And the following method(s) are optional, but can be provided:\n-# \n-# - :meth:`.get_route` gets a single route.\n-# There is a default implementation that extracts data from :meth:`.get_all_routes`,\n-# but implementations may choose to provide a more efficient implementation\n-# of fetching a single route.\n-\n-## Additional routes to be maintained in the proxy.\n-# \n-# A dictionary with a route specification as key, and a URL as target. The hub\n-# will ensure this route is present in the proxy.\n-# \n-# If the hub is running in host based mode (with JupyterHub.subdomain_host set),\n-# the routespec *must* have a domain component (example.com/my-url/). If the hub\n-# is not running in host based mode, the routespec *must not* have a domain\n-# component (/my-url/).\n-# \n-# Helpful when the hub is running in API-only mode.\n-# Default: {}\n-# c.Proxy.extra_routes = {}\n-\n-## Should the Hub start the proxy\n-# \n-# If True, the Hub will start the proxy and stop it.\n-# Set to False if the proxy is managed externally,\n-# such as by systemd, docker, or another service manager.\n-# Default: True\n-# c.Proxy.should_start = True\n-\n-#------------------------------------------------------------------------------\n-# ConfigurableHTTPProxy(Proxy) configuration\n-#------------------------------------------------------------------------------\n-## Proxy implementation for the default configurable-http-proxy.\n-# \n-# This is the default proxy implementation for running the nodejs proxy\n-# `configurable-http-proxy`.\n-# \n-# If the proxy should not be run as a subprocess of the Hub, (e.g. in a separate\n-# container), set::\n-# \n-# c.ConfigurableHTTPProxy.should_start = False\n-\n-## The ip (or hostname) of the proxy's API endpoint\n-# Default: ''\n-# c.ConfigurableHTTPProxy.api_url = ''\n-\n-## The Proxy auth token\n-# \n-# Loaded from the CONFIGPROXY_AUTH_TOKEN env variable by default.\n-# Default: ''\n-# c.ConfigurableHTTPProxy.auth_token = ''\n-\n-## Interval (in seconds) at which to check if the proxy is running.\n-# Default: 5\n-# c.ConfigurableHTTPProxy.check_running_interval = 5\n-\n-## The command to start the proxy\n-# Default: ['configurable-http-proxy']\n-# c.ConfigurableHTTPProxy.command = ['configurable-http-proxy']\n-\n-## The number of requests allowed to be concurrently outstanding to the proxy\n-# \n-# Limiting this number avoids potential timeout errors by sending too many\n-# requests to update the proxy at once\n-# Default: 10\n-# c.ConfigurableHTTPProxy.concurrency = 10\n-\n-## Add debug-level logging to the Proxy.\n-# Default: False\n-# c.ConfigurableHTTPProxy.debug = False\n-\n-## \n-# See also: Proxy.extra_routes\n-# c.ConfigurableHTTPProxy.extra_routes = {}\n-\n-## Proxy log level\n-# Choices: any of ['debug', 'info', 'warn', 'error'] (case-insensitive)\n-# Default: 'info'\n-# c.ConfigurableHTTPProxy.log_level = 'info'\n-\n-## File in which to write the PID of the proxy process.\n-# Default: 'jupyterhub-proxy.pid'\n-# c.ConfigurableHTTPProxy.pid_file = 'jupyterhub-proxy.pid'\n-\n-## Should the Hub start the proxy\n-# See also: Proxy.should_start\n-# c.ConfigurableHTTPProxy.should_start = True\n-\n-#------------------------------------------------------------------------------\n # Authenticator(LoggingConfigurable) configuration\n #------------------------------------------------------------------------------\n ## Base class for implementing an authentication provider for JupyterHub\n \n ## Set of users that will be granted admin rights on this JupyterHub.\n # \n # Note:\n@@ -1456,28 +1350,14 @@\n # c.Authenticator.username_pattern = ''\n \n ## Deprecated, use `Authenticator.allowed_users`\n # Default: set()\n # c.Authenticator.whitelist = set()\n \n #------------------------------------------------------------------------------\n-# CryptKeeper(SingletonConfigurable) configuration\n-#------------------------------------------------------------------------------\n-## Encapsulate encryption configuration\n-# \n-# Use via the encryption_config singleton below.\n-\n-# Default: []\n-# c.CryptKeeper.keys = []\n-\n-## The number of threads to allocate for encryption\n-# Default: 42\n-# c.CryptKeeper.n_threads = 42\n-\n-#------------------------------------------------------------------------------\n # DummyAuthenticator(Authenticator) configuration\n #------------------------------------------------------------------------------\n ## Dummy Authenticator for testing\n # \n # By default, any username + password is allowed If a non-empty password is set,\n # any username will be allowed if it logs in with that password.\n # \n@@ -2238,14 +2118,28 @@\n # \n # If the process does not exit cleanly after this many seconds of SIGTERM, a\n # SIGKILL is sent.\n # Default: 5\n # c.LocalProcessSpawner.term_timeout = 5\n \n #------------------------------------------------------------------------------\n+# CryptKeeper(SingletonConfigurable) configuration\n+#------------------------------------------------------------------------------\n+## Encapsulate encryption configuration\n+# \n+# Use via the encryption_config singleton below.\n+\n+# Default: []\n+# c.CryptKeeper.keys = []\n+\n+## The number of threads to allocate for encryption\n+# Default: 40\n+# c.CryptKeeper.n_threads = 40\n+\n+#------------------------------------------------------------------------------\n # NullAuthenticator(Authenticator) configuration\n #------------------------------------------------------------------------------\n ## Null Authenticator for JupyterHub\n # \n # For cases where authentication should be disabled, e.g. only allowing access\n # via API tokens.\n # \n@@ -2328,14 +2222,120 @@\n # c.NullAuthenticator.username_pattern = ''\n \n ## Deprecated, use `Authenticator.allowed_users`\n # See also: Authenticator.whitelist\n # c.NullAuthenticator.whitelist = set()\n \n #------------------------------------------------------------------------------\n+# Proxy(LoggingConfigurable) configuration\n+#------------------------------------------------------------------------------\n+## Base class for configurable proxies that JupyterHub can use.\n+# \n+# A proxy implementation should subclass this and must define the following\n+# methods:\n+# \n+# - :meth:`.get_all_routes` return a dictionary of all JupyterHub-related routes\n+# - :meth:`.add_route` adds a route - :meth:`.delete_route` deletes a route\n+# \n+# In addition to these, the following method(s) may need to be implemented:\n+# \n+# - :meth:`.start` start the proxy, if it should be launched by the Hub\n+# instead of externally managed.\n+# If the proxy is externally managed, it should set :attr:`should_start` to False.\n+# - :meth:`.stop` stop the proxy. Only used if :meth:`.start` is also used.\n+# \n+# And the following method(s) are optional, but can be provided:\n+# \n+# - :meth:`.get_route` gets a single route.\n+# There is a default implementation that extracts data from :meth:`.get_all_routes`,\n+# but implementations may choose to provide a more efficient implementation\n+# of fetching a single route.\n+\n+## Additional routes to be maintained in the proxy.\n+# \n+# A dictionary with a route specification as key, and a URL as target. The hub\n+# will ensure this route is present in the proxy.\n+# \n+# If the hub is running in host based mode (with JupyterHub.subdomain_host set),\n+# the routespec *must* have a domain component (example.com/my-url/). If the hub\n+# is not running in host based mode, the routespec *must not* have a domain\n+# component (/my-url/).\n+# \n+# Helpful when the hub is running in API-only mode.\n+# Default: {}\n+# c.Proxy.extra_routes = {}\n+\n+## Should the Hub start the proxy\n+# \n+# If True, the Hub will start the proxy and stop it.\n+# Set to False if the proxy is managed externally,\n+# such as by systemd, docker, or another service manager.\n+# Default: True\n+# c.Proxy.should_start = True\n+\n+#------------------------------------------------------------------------------\n+# ConfigurableHTTPProxy(Proxy) configuration\n+#------------------------------------------------------------------------------\n+## Proxy implementation for the default configurable-http-proxy.\n+# \n+# This is the default proxy implementation for running the nodejs proxy\n+# `configurable-http-proxy`.\n+# \n+# If the proxy should not be run as a subprocess of the Hub, (e.g. in a separate\n+# container), set::\n+# \n+# c.ConfigurableHTTPProxy.should_start = False\n+\n+## The ip (or hostname) of the proxy's API endpoint\n+# Default: ''\n+# c.ConfigurableHTTPProxy.api_url = ''\n+\n+## The Proxy auth token\n+# \n+# Loaded from the CONFIGPROXY_AUTH_TOKEN env variable by default.\n+# Default: ''\n+# c.ConfigurableHTTPProxy.auth_token = ''\n+\n+## Interval (in seconds) at which to check if the proxy is running.\n+# Default: 5\n+# c.ConfigurableHTTPProxy.check_running_interval = 5\n+\n+## The command to start the proxy\n+# Default: ['configurable-http-proxy']\n+# c.ConfigurableHTTPProxy.command = ['configurable-http-proxy']\n+\n+## The number of requests allowed to be concurrently outstanding to the proxy\n+# \n+# Limiting this number avoids potential timeout errors by sending too many\n+# requests to update the proxy at once\n+# Default: 10\n+# c.ConfigurableHTTPProxy.concurrency = 10\n+\n+## Add debug-level logging to the Proxy.\n+# Default: False\n+# c.ConfigurableHTTPProxy.debug = False\n+\n+## \n+# See also: Proxy.extra_routes\n+# c.ConfigurableHTTPProxy.extra_routes = {}\n+\n+## Proxy log level\n+# Choices: any of ['debug', 'info', 'warn', 'error'] (case-insensitive)\n+# Default: 'info'\n+# c.ConfigurableHTTPProxy.log_level = 'info'\n+\n+## File in which to write the PID of the proxy process.\n+# Default: 'jupyterhub-proxy.pid'\n+# c.ConfigurableHTTPProxy.pid_file = 'jupyterhub-proxy.pid'\n+\n+## Should the Hub start the proxy\n+# See also: Proxy.should_start\n+# c.ConfigurableHTTPProxy.should_start = True\n+\n+#------------------------------------------------------------------------------\n # LocalAuthenticator(Authenticator) configuration\n #------------------------------------------------------------------------------\n ## Base class for Authenticators that work with local Linux/UNIX users\n # \n # Checks for local users, and can attempt to create them if they exist.\n \n ## The command to use for creating users as a list of strings\n"}]}]}]}]}